/**
 * 数组的基本操作
 * c、java：相同数据类型的，长度固定的
 * js：任意数据类型的，长度不固定的
 */

// 数组的创建
const arr1 = new Array(); // 构造函数
const arr2 = []; // 数组字面量

// 数组是对象
console.log(typeof arr1); // object
console.log(Array.isArray(arr1)); // true，判断是不是数组对象

const arr = ["red", "green", "blue"];
// const arr3 = {
//     "0": "red",
//     "1": "green",
//     "2": "blue",
//     "99": 100,
// }
console.log(arr[0]);
// arr[99] = 100;
// console.log(arr[98]);
console.log(arr.length); // length 的值 是 最后一个元素的 下标值 + 1

// 可遍历的 iterable, for ... of 遍历属性值,  object， for ... in 遍历属性名
for (let elem of arr) {
  console.log(elem);
}

for (let index = 0; index < arr.length; index++) {
  console.log(arr[index]);
}

// 查找元素
console.log(arr.includes("blue")); // true, 是否包含
console.log(arr.indexOf("blue")); // 2, >=0 找到了

// 修改数组自身的操作
// 头部操作：shift\unshift，尾部操作：pop\push
// 队列：先进先出
arr.push("black"); // 末尾添加 [ 'red', 'green', 'blue', 'black' ]
console.log(arr);
let color = arr.shift(); // 头部移出 [ 'green', 'blue', 'black' ]
console.log(color);
console.log(arr);

// 栈：先进后出
arr.push("white"); // 末尾添加 [ 'green', 'blue', 'black', 'white' ]
// arr.splice(arr.length, 0, "white");
console.log(arr);
color = arr.pop(); // 末尾弹出 [ 'green', 'blue', 'black' ]
// arr.splice(arr.length - 1, 1);
console.log(color);
console.log(arr);

arr.unshift("red"); // 头部添加 [ 'red', 'green', 'blue', 'black' ] -> [ 'red', 'white', 'black' ]

// arr.splice(start[, deleteCount, elem1, ..., elemN])
arr.splice(1, 2, "white"); //  [ 'red', 'white', 'black' ]

// 反转
arr.reverse();

// 不修改数组自身，得到一个新数组
// 取子数组， 得到新数组
const subArr = arr.slice(1, 3); //  [ 'white', 'black' ]
console.log(subArr);
console.log(subArr === arr); // false

// 数组拼接， 得到新数组
const one = ["one"];
const two = ["two"];
const concatArr = one.concat(two);
console.log(concatArr);
console.log(concatArr === one); // false

// array -> string，将数组元素拼接成字符串
const joinStr = arr.join(":");
console.log(joinStr); // "black:white:red"
// string -> array, 将字符串按分隔符分离成多个数组元素
console.log(joinStr.split(":")); // [ 'black', 'white', 'red' ]
